/* 其他需要知道的类型 */
// void： The inferred return type is void
function noop() {
  return;
}

// object
// 这个特殊的类型 object 可以表示任何不是原始类型（primitive）的值 
// (string、number、bigint、boolean、symbol、null、undefined)。

// unknown
// unknown 类型表示任意值。
{
  function f1(a: any) {
    a.b(); // OK
  }
  function f2(a: unknown) {
    a.b();
    // Object is of type 'unknown'.
  }

  function safeParse(s: string): unknown {
    return JSON.parse(s);
  }
  
  // Need to be careful with 'obj'!
  const obj = safeParse('23');
}

// never
// 作为一个返回类型时，它表示这个函数会丢一个异常，或者会结束程序的执行。
{
  function fail(msg: string): never {
    throw new Error(msg);
  }
  function infiniteLoop(): never {
    while (true) {}
  }
  function fn(x: string | number) {
    if (typeof x === "string") {
      // do something
    } else if (typeof x === "number") {
      // do something else
    } else {
      x; // has type 'never'!
    }
  }
}

// Function
// 在 JavaScript，全局类型 Function 描述了 bind、call、apply 等属性，以及其他所有的函数值。
//它也有一个特殊的性质，就是 Function 类型的值总是可以被调用，结果会返回 any 类型
{
  // 这是一个无类型函数调用 (untyped function call)，这种调用最好被避免，因为它返回的是一个不安全的 any类型。
  // 如果你准备接受一个黑盒的函数，但是又不打算调用它，() => void 会更安全一些。
  function doSomething(f: Function) {
    f(1, 2, 3);
  }
}
